package com.shiwaixiangcun.authz;

import com.shiwaixiangcun.authz.config.RootConfig;
import com.shiwaixiangcun.authz.config.WebConfig;
import com.shiwaixiangcun.authz.shiro.filter.CORSFilter;
import com.shiwaixiangcun.core.CoreConstants;
import com.shiwaixiangcun.core.filters.MonkeyCharacterEncodingFilter;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.filter.HttpPutFormContentFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.Filter;

/**
 * 该类会在serlvet3.0环境中自动查找实现了 javax.servlet.ServletContainerInitializer接口的类来完成初始化（应该类似于替代web.xml）
 * 然而我们的这个类与ServletContainerInitializer没有一毛钱关系
 * 但是Spring的SpringServletContainerInitializer实现了这个接口
 * 在SpringServletContainerInitializer中会查找实现类了WebApplicationInitializer接口的类并将配置任务交给他们完成
 * 当然我们的ApplicationInitializer也就是间接实现了这个接口
 *
 * @author silentwu
 * 而且在继承这个抽象类时，必须实现如下的三个方法
 */
public class ApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    /**
     * 类似于web.xml中配置ContextLoaderListener的contextConfigLocation
     * 只是这个返回的是一个JavaConfig的数组Class
     */
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[]{RootConfig.class};
    }

    /**
     * 类似于web.xml中配置DispatcherServlet的contextConfigLocation
     * 只是这个返回的是一个JavaConfig的数组Class
     */
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[]{WebConfig.class};
    }

    /**
     * 等同
     */
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }

    /*
     * 注册过滤器，映射路径与DispatcherServlet一致，路径不一致的过滤器需要注册到另外的WebApplicationInitializer中
     */
    @Override
    protected Filter[] getServletFilters() {
        DelegatingFilterProxy delegatingFilterProxy = new DelegatingFilterProxy();
        delegatingFilterProxy.setTargetFilterLifecycle(true);
        delegatingFilterProxy.setTargetBeanName("shiroFilter");

        return new Filter[]{
                new CORSFilter(),
                new HttpPutFormContentFilter(),
                new MonkeyCharacterEncodingFilter(CoreConstants.ENCODING, true, true),
                delegatingFilterProxy
        };
    }
}
